import axios from "axios";
import type { InternalAxiosRequestConfig, AxiosError, AxiosRequestConfig, AxiosResponse } from "axios"
import { getToken, clearToken } from "./token";
import { ElMessage } from 'element-plus'
import { useUserStore } from "@/stores";
import router from "@/router";

const service = axios.create({
    baseURL: import.meta.env.BASE_URL,
    timeout: 30000
})



service.interceptors.request.use(
    (config: InternalAxiosRequestConfig) => {
        const token = getToken()
        // 配置请求权限
        if (token) {
            config.headers["Authorization"] = 'Bearer ' + token
        }
        return config
    },
    (error: AxiosError) => {
        Promise.reject(error)
    }
)

// 在这里没有找到泛型约束的方法
service.interceptors.response.use()

// 根据实际情况自行修改
type Data<T> = {
    status: boolean,
    msg: string,
    result: T
}

// 暴露一个异步函数，接受一个泛型T传入Data,再将Data<T>传入service.request

export default <T>(config: AxiosRequestConfig) => {
    return new Promise<Data<T>>((res, rej) => {
        service
            .request<Data<T>>(config)
            .then((response) => {
                // 打印结果如下
                // console.log(response);
                // 逻辑自行处理
                res(response.data);
            })

            .catch((err: AxiosError<{ status: boolean, error: string, msg: string }>) => {
                const res = err.response
                console.log(res);

                if (res?.status === 401) {
                    clearToken()
                    const userStore = useUserStore()
                    userStore.clearUserInfo()
                    router.push('/login')
                }
                ElMessage.error(res?.data.error)
                //  处理错误逻辑
                rej(err);
            });
    });
};
